package edu.pe.cayetano.model.bo;

import java.util.ArrayList;

import org.apache.commons.beanutils.DynaBean;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.dao.ModuloDAO;
import edu.pe.cayetano.dao.OperacionesComunesDAO;
import edu.pe.cayetano.dao.PerfilDAO;
import edu.pe.cayetano.framework.BusinessException;
import edu.pe.cayetano.framework.Configuration;
import edu.pe.cayetano.model.bean.PerfilBean;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;
import edu.pe.cayetano.util.Utilitario;

public class PerfilBO  extends BaseBO{

	private	String		schema			= Configuration.getSchemaDB();
	
	public StringBuffer estableceQuery(DynaBean dyna){
		StringBuffer 			query 			= new StringBuffer();
		String 			campo		= (String)dyna.get("optCampo");
		String 			criterio	= (String)dyna.get("criterio");
		String 			operacion	= (String)dyna.get("operacion");
	
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query.append(" SELECT A.COD_PERFIL AS COD_PERFIL,A.NOMBRE AS PERFIL,B.NOMBRE AS ESTADO ");
				query.append(" FROM "+schema+"PERFIL A INNER JOIN "+schema+"ESTADO B ");
				query.append(" ON A.ESTADO_ID=B.ESTADO_ID ");
				query.append(" WHERE A.COD_PERFIL NOT IN (0)");
			}else{
				query.append(" SELECT A.COD_PERFIL AS COD_PERFIL,A.NOMBRE AS PERFIL,B.NOMBRE AS ESTADO ");
				query.append(" FROM "+schema+"PERFIL A INNER JOIN "+schema+"ESTADO B ");
				query.append(" ON A.ESTADO_ID=B.ESTADO_ID ");
				query.append(" WHERE UPPER("+campo+") LIKE '%"+criterio.toUpperCase()+"%' AND A.COD_PERFIL NOT IN (0)"); 
			}
		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query.append(" SELECT A.COD_PERFIL AS COD_PERFIL,A.NOMBRE AS PERFIL,B.NOMBRE AS ESTADO ");
			query.append(" FROM "+schema+"PERFIL A INNER JOIN "+schema+"ESTADO B ");
			query.append(" ON A.ESTADO_ID=B.ESTADO_ID ");
			query.append(" WHERE A.COD_PERFIL NOT IN (0)");

		}
		System.out.println("PerfilBO:estableceQuery:"+query.toString());
		return query;
	}

	public BResult listarPerfil() throws BusinessException{
		BResult 				retSalida		= null;
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			DynaBean dyna = Utilitario.seteaDynaBeanListadoTabla(null,null,null);
		    query = estableceQuery(dyna);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(-1);
			retSalida.setMessage("[PerfilBO] error en metodo listarPerfil generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[PerfilBO] error en metodo listarPerfil generado po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult getPerfiles() throws BusinessException{
		
		BResult 	ret					= new BResult();
		ArrayList<PerfilBean> 	listadoPerfiles 	= new ArrayList<PerfilBean>();
		
		try{
			conectar();
			PerfilDAO perfilDAO = new PerfilDAO(conn);
			listadoPerfiles = perfilDAO.getPerfiles();
			ret.setObject(listadoPerfiles);
		}catch(Exception e){
			ret.setException(e);
		}finally{
			try{
				desconectar();
			}catch(Exception e){
			}
		}
		return ret;
	}
	
	public BResult buscarPerfil(DynaBean dyna) throws BusinessException{
		BResult 				retSalida			= null;
		OperacionesComunesDAO	operacionesDAO		= null;
		try{
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			StringBuffer query = estableceQuery(dyna);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(-1);
			retSalida.setMessage("[PerfilBO] error en metodo buscarPerfil generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[PerfilBO] error en metodo buscarPerfil generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult insertar(PerfilBean perfilTO) throws BusinessException{
		BResult ret=new BResult();
		try{
			conectar();
			PerfilDAO perfilDAO=new PerfilDAO(conn);
			perfilDAO.insertar(perfilTO);
			perfilDAO.insertar_modulos(perfilTO);
		}catch(Exception e){
			try{deshacer();}catch(Exception ex){}
			ret.setCode(-1);
		}finally{
			try{desconectar();}catch(Exception e){}
		}
		return ret;	
	}
	
	public BResult editarPerfil(PerfilBean perfilTO) throws BusinessException{
		BResult ret=new BResult();
		try{
			conectar();
			PerfilDAO perfilDAO=new PerfilDAO(conn);
			perfilDAO.editarPerfil(perfilTO);
			perfilDAO.eliminarPerfilModulo(perfilTO.getCodigo());
			perfilDAO.insertar_modulos(perfilTO);
			grabar();
		}catch(Exception e){
			try{
				deshacer();
			}catch(
					Exception ex){
			}	
			ret.setCode(-1);
		}finally{
			try{desconectar();}catch(Exception e){}
		}
		return ret;	
	}
	
	public BResult getPerfilEspecifico(DynaBean dyna) throws BusinessException{
		BResult 				retSalida 		= new BResult();
		StringBuffer 			query 			= new StringBuffer(); 
		PerfilDAO				perfilDAO		= null;
		try{
			conectar();
			perfilDAO	 	= new PerfilDAO(conn);
			retSalida 	= perfilDAO.getPerfilEspecifico(dyna);
		}catch(Exception e){
			
			retSalida.setCode(-1);
			retSalida.setMessage("[PerfilBO] error en metodo getPerfilEspecifico generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[PerfilBO] error en metodo getPerfilEspecifico generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult generaCodigoPerfil() throws BusinessException{
		BResult 				retSalida 		= new BResult();
		PerfilDAO				perfilDAO		= null;
		try{
			conectar();
			perfilDAO	 	= new PerfilDAO(conn);
			int codigo = perfilDAO.obtieneUltimoCodigoPerfil();
			retSalida.setObject(String.valueOf(codigo));
			retSalida.setCode(0);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(-1);
			retSalida.setMessage("[PerfilBO] error en metodo generaCodigoPerfil generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[PerfilBO] error en metodo generaCodigoPerfil generado por:"+e.getMessage());
			}
		}
		return retSalida;
	}
}
